/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Almacenamiento;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 *
 * @author Christian
 */
public class Relacion implements java.io.Serializable, Iterable<Atributo> {
    // lista de atributos de la relacion
    private List<Atributo> atributos;
    
    //constructor por  Default de una relacion
    public Relacion() {
        atributos = new ArrayList<Atributo> ();
    }
    /**
     * Constructor de relacion dado una <code>Listaz/code> de atributos
     * 
     * @param atributos, atributos de la relacion
     */
    
    public Relacion(List<Atributo> atributos) {
        this.atributos = new ArrayList<Atributo>(atributos);
    }
    /**
     * Añadir un atributo a la relacion
     * 
     *@param atributo, atributo a ser añadido
     */
    protected void adicionarAtributo(Atributo atributo) {
        atributos.add(atributo);
    }
    /**
     * Devuelve el numero de atributos de la relacion
     * 
     * @return numero de atributos de una <code>Relacion</code>
     */
    
    public int getNumeroDeAtributos() {
        return atributos.size();
    }
    /**
     * Devuelve un <code>Iterator</code> sobre los atributos de la relacion
     * 
     * @return <code>Iterator</code> de atributos de la <code>Relacion</code>
     */
    
    @Override
    public Iterator<Atributo> iterator() {
        return atributos.iterator();
    }
    
    /**
     * Devuelve un atributo especifico de la relacion
     * 
     * @param i el indice del atributo que sera devuelto
     * @return el atributo especificado
     */
    public Atributo getAtributo(int i) {
        return atributos.get(i);
    }
    
    /**
     * Dado el nombre del atributo, se devuelve el indice de este atributo
     * en el esquema de la relacion. Se devuelve <code>-1</code> si el atributo
     * no aparece en el esquema de la relacion
     * 
     * @param str el nombre del atributo
     * @return el indice del atributo en el esquema de la relacion
     * <code>-1</code> si el atributo no aparece en el esquema de la relacion
     */
    public int getIndiceAtributo(String str) {
        int i=0;
        for (Atributo atributo : atributos) {
            if (atributo.getNombre().equals(str)) {
                return i;
            }
        }
        return -1;
    }// getIndiceAtributo();
    
    // metodo para eliminar atributo
    protected void EliminarAtributo(Atributo atributo) {
        atributos.remove(atributo);
    } 
    /**
     * Representacion textual de una relacion
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("(");
        for (int i = 0; i< getNumeroDeAtributos() -1;i++) {
            sb.append(getAtributo(i)).append(", ");
        }
        sb.append(getAtributo(getNumeroDeAtributos()-1)).append(")");
        return sb.toString();
    }//toString()
}
